#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>

int addTotal(int x,int y){
  int sum = 0;
  for(int i = x;i < y; i++){
      sum += i;
  }
  exit(21);
  return sum; 
}

int main(){
  //解决僵尸进程的方法：进程等待
  pid_t id = fork();
  if(id == 0){
    //子进程
    int cnt =5;
    while(cnt){
      printf("我是子进程：%d,父进程:%d,cnt:%d\n",getpid(),getppid(),cnt--);
      sleep(1);
    }
    //尝试制造一个野指针错误
    //int* p = NULL;
    //*p+=2;
    exit(10);//这里的exit只会终止子进程，父亲进程继续运行
  }
  //父亲进程
  sleep(10);
  //pid_t ret = wait(NULL);//wait返回值：成功则返回被等待进程的pid，失败则返回-1
  int status  = 0;
  //pcid_t ret = wait(NULL);//wait等待成功则返回被等待进程的pid，等待失败则返回-1
  //pid_t ret = waitpid(id,&status,0);
  //if(ret > 0){
  //  printf("等待成功！：%d\n,sign number:%d,child exit code:%d\n",ret,(status & 0x7F),(status >> 8)&0xFf);
  //// printf("wait success! ret：%d\n",ret);
  //}
  
  //不想通过位运算拿到子进程的退出状态码。可以使用2个函数
  pid_t ret = waitpid(id,&status,0);
  if(ret > 0){
    //判断是否正常退出
    if(WIFEXITED(status)){
      printf("child exit code : %d\n",WEXITSTATUS(status));
    }else{
      printf("不正常退出\n");
    }
  }
  sleep(5);




 // for(int i=0;i<200;i++){
 //   printf("%d :%s\n",i,strerror(i));
 // }
  
  


//   int num = addTotal(1,100); 
//   if(num == 5050){
//    return 0;
//  }else{
//    return -1;
//  }
  return 0;
}
